package cn.gp.chat.common.utils;

import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
import java.time.Instant;

@Data
@Accessors(chain = true) // 支持链式调用
public class ApiResponse<T> {
    private boolean success;    // 请求是否成功
    private int code;          // 状态码（HTTP 状态码或业务码）
    private String message;    // 提示信息
    private T data;            // 响应数据（支持单对象、集合或分页）
    private long timestamp;    // 时间戳（自动生成）

    // 构造函数私有化，强制使用静态工厂方法
    private ApiResponse(boolean success, int code, String message, T data) {
        this.success = success;
        this.code = code;
        this.message = message;
        this.data = data;
        this.timestamp = Instant.now().toEpochMilli(); // 自动设置时间戳
    }

    /**
     * @Return cn.gp.chat.common.utils.ApiResponse<T>
     * @Description 成功响应
     * @Author He Guoping
     * @Date 2025/6/19 9:41
     */
    public static <T> ApiResponse<T> success() {
        return new ApiResponse<>(true, 200, "OK", null);
    }

    /**
     * @Param data
     * @Return cn.gp.chat.common.utils.ApiResponse<T>
     * @Description 成功响应
     * @Author He Guoping
     * @Date 2025/6/19 9:41
     */
    public static <T> ApiResponse<T> success(T data) {
        return new ApiResponse<>(true, 200, "OK", data);
    }

    /**
     * @Param list
     * @Return cn.gp.chat.common.utils.ApiResponse<java.util.List < T>>
     * @Description 成功响应
     * @Author He Guoping
     * @Date 2025/6/19 9:42
     */
    public static <T> ApiResponse<List<T>> success(List<T> list) {
        return new ApiResponse<>(true, 200, "OK", list);
    }

    /**
     * @Param code
     * @Param message
     * @Return cn.gp.chat.common.utils.ApiResponse<T>
     * @Description 失败响应
     * @Author He Guoping
     * @Date 2025/6/19 9:42
     */
    public static <T> ApiResponse<T> fail(int code, String message) {
        return new ApiResponse<>(false, code, message, null);
    }

    /**
     * @Return null
     * @Description 分页响应
     * @Author He Guoping
     * @Date 2025/6/19 9:42
     */
    @Data
    public static class PageResult<T> {
        private List<T> list;     // 当前页数据
        private long total;       // 总条数
        private int pageNum;      // 当前页码
        private int pageSize;     // 每页大小

        public PageResult(List<T> list, long total, int pageNum, int pageSize) {
            this.list = list;
            this.total = total;
            this.pageNum = pageNum;
            this.pageSize = pageSize;
        }
    }

    public static <T> ApiResponse<PageResult<T>> successPage(List<T> list, long total, int pageNum, int pageSize) {
        PageResult<T> pageResult = new PageResult<>(list, total, pageNum, pageSize);
        return new ApiResponse<>(true, 200, "OK", pageResult);
    }
}